package com.tuzhi.sys.scurity;

import com.tuzhi.sys.dto.SysMenuTreeDto;
import com.tuzhi.sys.jpa.entity.SysMenuEntity;
import com.tuzhi.sys.jpa.entity.SysRoleEntity;
import com.tuzhi.sys.jpa.entity.SysUserEntity;

import java.util.Collection;
import java.util.List;

/**
 * 权限相关服务
 */
public interface AuthService {
    /**
     * 查找用户所有的权限标识
     *
     * @param userId
     * @return
     */
    List<String> loadPerms4User(Long userId);

    /**
     * 查找角色所有的权限标识
     *
     * @param roleId
     * @return
     */
    List<String> loadPerms4Role(Long roleId);


    /**
     * 查找角色所有的权限标识
     *
     * @param roleName
     * @return
     */
    List<String> loadPerms4Role(String roleName);

    /**
     * 查找用户所有的url
     *
     * @param userId
     * @return
     */
    List<String> loadUrls4User(Long userId);

    /**
     * 查找角色所有的url
     *
     * @param roleId
     * @return
     */
    List<String> loadUrls4Role(Long roleId);

    /**
     * 查找角色所有的url
     *
     * @param roleName
     * @return
     */
    List<String> loadUrls4Role(String roleName);

    /**
     * 查找用户所有的角色ID
     *
     * @param userId
     * @return
     */
    List<Long> loadRoleIds(Long userId);

    /**
     * 查找用户所有的角色名
     *
     * @param userId
     * @return
     */
    List<String> loadRoleNames(Long userId);

    /**
     * 查找用户所有的菜单Id
     *
     * @param userId
     * @return
     */
    List<Long> loadMenus(Long userId);

    /**
     * 查找角色授权的菜单IDs
     *
     * @param roleId
     * @return
     */
    List<Long> LoadMenuId4Role(Long roleId);

    /**
     * 保存用户角色
     *
     * @param userId  用户ID
     * @param roleIds 角色ID集合
     */
    void saveUserRole(Long userId, Collection<Long> roleIds);


    /**
     * 保存用户角色
     *
     * @param userId    用户ID
     * @param roleNames 角色ID集合
     */
    void saveUserRoleByName(Long userId, Collection<String> roleNames);

    /**
     * 保存角色功能菜单权限
     *
     * @param roleId  角色ID
     * @param menuIds 功能菜单ID集合
     */
    void savePerms4Role(Long roleId, Collection<Long> menuIds);

    /**
     * 判断角色是否有权限
     *
     * @param roleId 角色Id
     * @param perm   权限标识
     * @return
     */
    boolean hasPerm4Role(Long roleId, String perm);

    /**
     * 判断角色是否有权限
     *
     * @param roleName 角色名称
     * @param perm     权限标识
     * @return
     */
    boolean hasPerm4Role(String roleName, String perm);


    /**
     * 查找完整的菜单树，并标记角色权限
     *
     * @param roleId
     * @return
     */
    List<SysMenuTreeDto> loadAllMenuTree4Role(Long roleId);

    /**
     * 查找指定角色与操作用户拥有的菜单树权限
     *
     * @param roleId 指定的角色
     * @param userId 操作用户id
     * @return
     */
    List<SysMenuTreeDto> loadAllMenuTree4RoleBaseOpUser(Long roleId, Long userId);

    /**
     * 查找用户有权限的菜单树,返回完整的菜单树，标记了有权限的节点
     *
     * @param userId
     * @return
     */
    List<SysMenuTreeDto> loadUserMenuTree(Long userId);


    /**
     * 查找用户有权限的菜单树（有权限的才返回）
     *
     * @param userId
     * @return
     */
    List<SysMenuTreeDto> loadUserMenuTreeOnly(Long userId);

    /**
     * 判断用户是否超级管理员
     *
     * @param userId
     * @return
     */
    public boolean superAdmin(Long userId);

    /**
     * 判断用户是否企业管理员
     *
     * @param userId
     * @return
     */
    public boolean enterpriseAdmin(Long userId);


    /**
     * 判断用户是否有指定权限标识权限
     *
     * @param userId
     * @param perm
     * @return
     */
    public boolean hasPerm4User(Long userId, String perm);


    /**
     * 判断用户是否有指定 url 权限
     *
     * @param userId
     * @param url
     * @return
     */
    public boolean hasUri4User(Long userId, String url);

    /**
     * 保存用户与角色，同时会更新缓存数据
     *
     * @param entity
     */
    SysUserEntity saveUserAndRole(SysUserEntity entity);

    /**
     * 根据用户账号查询角色列表
     *
     * @param userName
     * @return
     */
    List<SysRoleEntity> listRoles4UserName(String userName);

    /**
     * 查找角色 权限标识:先从缓存中找，没有再从数据库中找
     *
     * @param roleName
     * @return
     */
    Collection<String> findRolePerms4CacheAndDb(String roleName);

    /**
     * 查找角色 url :先从缓存中找，没有再从数据库中找
     *
     * @param roleName
     * @return
     */
    Collection<String> findRoleUrls4CacheAndDb(String roleName);

    /**
     * 查找用户 权限标识:先从缓存中找，没有再从数据库中找
     *
     * @param userId
     * @return
     */
    Collection<String> findUserPerms4CacheAndDb(Long userId);

    /**
     * 查找用户 url:先从缓存中找，没有再从数据库中找
     *
     * @param userId
     * @return
     */
    Collection<String> findUserUrls4CacheAndDb(Long userId);

    /**
     * 查找用户角色:先从缓存中找，没有再从数据库中找
     *
     * @param userId
     * @return
     */
    Collection<String> findUserRoleName4CacheAndDb(Long userId);


    /**
     * 删除用户
     * 要把用户与角色的中间关联表记录也删除
     *
     * @param userId
     * @return
     */
    void deleteUser(Long userId);


    /**
     * 删除角色
     * 要把用户与角色的中间关联表记录也删除
     * 要把角色与菜单的中间关联表记录也删除
     *
     * @param roleId
     * @return
     */
    void deleteRole(Long roleId);


    /**
     * 删除菜单
     * 要把角色与菜单的中间关联表记录也删除
     *
     * @param menuId
     * @return
     */
    void deleteMenu(Long menuId);

    /**
     * 删除菜单
     * 要把角色与菜单的中间关联表记录也删除
     *
     * @param menuEntity
     * @return
     */
    void saveMenu(SysMenuEntity menuEntity);

    /**
     * 保存角色的权限菜单
     * @param roleId
     * @param menuIds
     */
    void saveRoleAuth(Long roleId, List<Long> menuIds);


}
